package com.itheima.health.job;

import com.itheima.health.common.RedisConst;
import com.itheima.health.service.SetMealService;
import com.itheima.health.utils.QiniuUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;

@Slf4j
@Component
public class TimedTask {

    private final static Long MAX_TIME = 10*60*1000L;

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    QiniuUtils qiniuUtils;

    @DubboReference
    SetMealService setMealService;

    @Scheduled(cron = "0 0/10 * * * ?")
    public void timingRedisImg(){
        /*
        * @Date: 6:08 下午 2021/1/8
        * @param: []
        * @return: void
        * @Description: 制作定时任务，清除垃圾文件
        * 1、获取存入redis中图片的时长，超过指定时间代表是垃圾文件（防止用户填写信息时还未提交图片就被删除）
        * 2、数据库中进行判断是否有这个文件(redis和mysql不在一个事务中，防止表单已经提交但是redis还没有删除)
        */
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sdf.format(date);
        log.info(format+" - 定时任务: 开始清理垃圾图片");
        //从redis中获取set集合中所有数据
        Set<String> members = redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES).members();
        log.info("[定时任务-清理垃圾图片] - redis中垃圾图片: {}",members);
        //如果set为空直接跳过
        if (members!=null){
            //遍历set集合中所有的数据，得到每一数据
            for (String img : members) {
                //判断这张图片在redis中存储时长，低于这个时间代表用户还在设置信息，超过这个时间代表垃圾文件需要进行删除
                String[] strings = img.split("_");
                Long createTime = Long.valueOf(strings[0]);
                long time = System.currentTimeMillis() - createTime;
                if (MAX_TIME>time){
                    log.info("[定时任务-清理垃圾图片] - 图片被使用跳过: {}",img);
                    continue;
                }
                //数据库中进行判断是否有这个文件(redis和mysql不在一个事务中，防止表单已经提交但是redis还没有删除)
                Integer count = setMealService.imgCount(img);
                if (count==0){
                    log.info("[定时任务-清理垃圾图片] - 清理图片: {}",img);
                    //数据库中没有则进行删除
                    qiniuUtils.deleteFileFromQiniu(img);
                    redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES).remove(img);
                }
            }
        }
        log.info(format+" - 定时任务: 垃圾图片清理完毕");

    }
}
